/*
 * Copyright 2002-2017 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.beans.factory.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Marks a constructor, field, setter method or config method as to be autowired
 * by Spring's dependency injection facilities.
 *
 * 将构造函数、字段、setter方法或配置方法标记为由Spring的依赖项注入工具自动生成的。
 *
 * <p>Only one constructor (at max) of any given bean class may carry this annotation,
 * indicating the constructor to autowire when used as a Spring bean. Such a
 * constructor does not have to be public.
 *
 * 任何给定bean类中只有一个构造函数(最多一个)可以携带此注释，
 * 这表明在作为Spring bean使用时构造函数将自动装配。这样的构造函数不必是公共的。
 *
 * <p>Fields are injected right after construction of a bean, before any config
 * methods are invoked. Such a config field does not have to be public.
 *
 * 字段在构造bean之后立即注入，然后调用任何配置方法。这样的配置字段不必是公共的。
 *
 * <p>Config methods may have an arbitrary name and any number of arguments; each of
 * those arguments will be autowired with a matching bean in the Spring container.
 * Bean property setter methods are effectively just a special case of such a general
 * config method. Such config methods do not have to be public.
 *
 * 配置方法可以有任意的名称和任意数量的参数;这些参数中的每一个都将由Spring容器中的匹配bean自动生成。
 * Bean属性设置方法实际上只是这种通用配置方法的一个特例。这样的配置方法不必是公共的。
 *
 * <p>In the case of a multi-arg constructor or method, the 'required' parameter is
 * applicable to all arguments. Individual parameters may be declared as Java-8-style
 * {@link java.util.Optional} or, as of Spring Framework 5.0, also as {@code @Nullable}
 * or a not-null parameter type in Kotlin, overriding the base required semantics.
 *
 * 对于多参数构造函数或方法，“required”参数适用于所有参数。
 * 单独的参数可以声明为java 8风格的{ @link java.util.Optional }或(从Spring Framework 5.0开始)，
 * 也可以作为{@code @Nullable}或Kotlin中的非空参数类型，覆盖基本的必需语义。
 *
 * <p>In case of a {@link java.util.Collection} or {@link java.util.Map} dependency type,
 * the container autowires all beans matching the declared value type. For such purposes,
 * the map keys must be declared as type String which will be resolved to the corresponding
 * bean names. Such a container-provided collection will be ordered, taking into account
 * {@link org.springframework.core.Ordered}/{@link org.springframework.core.annotation.Order}
 * values of the target components, otherwise following their registration order in the
 * container. Alternatively, a single matching target bean may also be a generally typed
 * {@code Collection} or {@code Map} itself, getting injected as such.
 *
 * 对于{@link java.util.Collection}或{@link java.util.Map}依赖类型，容器自动连接所有匹配声明值类型的bean。
 * 为此，映射键必须声明为类型String，类型String将解析为相应的bean名称。
 * 考虑到这一点，将订购这样一个容器提供的集合{@link org.springframework.core.Ordered}/{@link org.springframework.core.annotation.Order},
 * 对象组件的值，否则按照其在容器中的注册顺序执行。
 * 或者，单个匹配的目标bean也可以是一般类型的{@code Collection}或{@code Map}本身，以这样的方式注入。
 *
 * <p>Note that actual injection is performed through a
 * {@link org.springframework.beans.factory.config.BeanPostProcessor
 * BeanPostProcessor} which in turn means that you <em>cannot</em>
 * use {@code @Autowired} to inject references into
 * {@link org.springframework.beans.factory.config.BeanPostProcessor
 * BeanPostProcessor} or
 * {@link org.springframework.beans.factory.config.BeanFactoryPostProcessor BeanFactoryPostProcessor}
 * types. Please consult the javadoc for the {@link AutowiredAnnotationBeanPostProcessor}
 * class (which, by default, checks for the presence of this annotation).
 *
 * 注意，实际的注入是通过执行的一个{@link org.springframework.beans.factory.config.BeanPostProcessor},
 * 意味着你不能通过{@code @Autowired} 注入引用
 * {@link org.springframework.beans.factory.config.BeanPostProcessor
 * BeanPostProcessor} 或者
 * {@link org.springframework.beans.factory.config.BeanFactoryPostProcessor BeanFactoryPostProcessor}
 * 类型.
 * @author Juergen Hoeller
 * @author Mark Fisher
 * @since 2.5
 * @see AutowiredAnnotationBeanPostProcessor
 * @see Qualifier
 * @see Value
 */
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {

	/**
	 * Declares whether the annotated dependency is required.
	 * <p>Defaults to {@code true}.
	 */
	boolean required() default true;

}
